package main

import (
	"crypto/md5"
	"crypto/sha512"
	"encoding/hex"
	"fmt"
	"github.com/anaskhan96/go-password-encoder"
	"io"
	"strings"
)

func genMd5(code string) string {
	Md5 := md5.New()
	//Md5.Write([]byte(code))				// 实际等同于此方法  io.WriteString
	_, _ = io.WriteString(Md5, code)

	//fmt.Println(Md5.Sum(nil))
	//data := Md5.Sum(nil)
	//const hextable = "0123456789abcdef"
	//for _, v := range data {
	//	//fmt.Println(v)
	//	fmt.Println(v >> 4)   // >> 4 是位运算 向右 移动4个位置  相当于 除 16  取整
	//	fmt.Println(v & 0x0f) // 0x0f 二进制中显示为 1111   & 去相同的部分  所以这个 v & 0x0f是去余
	//	fmt.Printf("%x\n", v)
	//	fmt.Println("hextable[v>>4]", hextable[v>>4]) // 先算出16进制下显示是字符 需要于 ASCII对应
	//	fmt.Println(string(hextable[v>>4]))
	//	fmt.Println("hextable[v&0x0f]:", hextable[v&0x0f]) // 十六进制
	//	fmt.Println(string(hextable[v&0x0f]))
	//	fmt.Println("-----------")
	//}

	//fmt.Printf("%x\n", Md5.Sum(nil))		// 实际等同于此方法  hex.EncodeToString
	return hex.EncodeToString(Md5.Sum(nil)) // 5abf332dec3891f5fc8dc081aeb88278
}

func main() {
	//fmt.Println(genMd5("123456"))
	//// 将用户的密码变一下 随机字符串+用户密码

	options := &password.Options{10, 100, 32, sha512.New}
	salt, encodedPwd := password.Encode("generic password", options)
	newPassword := fmt.Sprintf("$pbkdf2-sha512$%s$%s", salt, encodedPwd)
	fmt.Println(newPassword)

	passwordInfo := strings.Split(newPassword, "$")
	fmt.Println(passwordInfo)
	check := password.Verify("generic password", passwordInfo[2], passwordInfo[3], options)
	fmt.Println(check) // true
}
